package thread;

import android.app.Activity;
import android.os.Bundle;
import android.support.annotation.Nullable;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 创建时间：2018年03月09日16:24 <br>
 * 作者：fuchaoyang <br>
 * 描述：ThreadLocal 一般称为线程本地变量，它是一种特殊的线程绑定机制，将变量与线程绑定在一起，为每一个线程维护一个独立的变量副本。
 * 通过ThreadLocal可以将对象的可见范围限制在同一个线程内。
 */

public class LocalThreadUI extends Activity {

  @Override protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    for (int i = 0; i < 5; i++) {
      final Thread t = new Thread() {
        @Override public void run() {
          System.out.println(
            "当前线程:" + Thread.currentThread().getName() + ",已分配ID:" + ThreadId.get());
        }
      };
      t.start();
    }
  }

  static class ThreadId {
    // 一个递增的序列，使用AtomicInger原子变量保证线程安全
    private static final AtomicInteger nextId = new AtomicInteger(0);
    // 线程本地变量，为每个线程关联一个唯一的序号
    private static final ThreadLocal<Integer> threadId = new ThreadLocal<Integer>() {
      @Override protected Integer initialValue() {
        //相当于nextId++,由于nextId++这种操作是个复合操作而非原子操作，会有线程安全问题(可能在初始化时就获取到相同的ID，所以使用原子变量
        return nextId.getAndIncrement();
      }
    };

    //返回当前线程的唯一的序列，如果第一次get，会先调用initialValue，后面看源码就了解了
    public static int get() {
      return threadId.get();
    }
  }
}
